package xyz.xmh.dao.file;

import org.springframework.web.reactive.function.client.WebClient;
import xyz.xmh.pojo.entity.BaseItem;
import xyz.xmh.pojo.enums.CategoryEnum;
import xyz.xmh.pojo.enums.CheckNameEnum;
import xyz.xmh.pojo.request.file.ListRequest;
import xyz.xmh.pojo.request.file.MultiDownloadUrlRequest;
import xyz.xmh.pojo.request.file.SearchRequest;
import xyz.xmh.pojo.request.file.UpdateRequest;
import xyz.xmh.pojo.response.file.*;

import java.nio.file.OpenOption;
import java.nio.file.Path;

/**
 * 文件操作
 *
 * @author xuMingHai
 */

public interface FileDao {

    /**
     * 使用默认参数获取文件列表
     *
     * @return 文件列表响应
     */
    ListResponse list();

    /**
     * 使用自定义参数获取文件列表
     *
     * @param listRequest 请求参数
     * @return 文件列表响应
     */
    ListResponse list(ListRequest listRequest);


    /**
     * 根据文件名搜索文件
     *
     * @param fileName 文件名
     * @return 搜索响应结果。
     */
    SearchResponse search(String fileName);


    /**
     * 根据指定的文件名和文件类型搜索文件
     *
     * @param fileName     文件名
     * @param categoryEnum 文件类型
     * @return 搜索响应结果。
     */
    SearchResponse search(String fileName, CategoryEnum categoryEnum);


    /**
     * 根据指定的文件名和文件类型搜索文件
     *
     * @param searchRequest 自定义搜索请求参数
     * @return 搜索响应结果
     */
    SearchResponse search(SearchRequest searchRequest);

    /**
     * 获取单个文件的信息
     *
     * @param fileId 文件ID
     * @return 文件信息（可以根据类型转为对应的子类）
     */
    BaseItem get(String fileId);

    /**
     * 获取文件的下载参数
     *
     * @param fileId 文件ID
     * @return 下载参数
     */
    DownloadUrlResponse getDownloadUrl(String fileId);

    /**
     * 下载文件
     *
     * @param fileId      文件ID
     * @param path        下载到的目标地址(不需要指定文件名)
     * @param openOptions 参数选项
     * @return 文件字节数
     */
    long downloadFile(String fileId, Path path, OpenOption... openOptions);


    /**
     * 获取多个文件的下载地址
     *
     * @param multiDownloadUrlRequest 多个文件请求
     * @return 下载地址
     */
    MultiDownloadUrlResponse getMultiDownloadUrl(MultiDownloadUrlRequest multiDownloadUrlRequest);

    /**
     * 下载多个文件
     *
     * @param multiDownloadUrlRequest 多个文件请求
     * @param path                    下载到的目标地址（不需要指定文件名）
     * @param openOptions             打开参数
     * @return 下载的文件字节数
     */
    long multiDownloadFile(MultiDownloadUrlRequest multiDownloadUrlRequest, Path path, OpenOption... openOptions);

    /**
     * 创建文件夹
     *
     * @param parentFileId  父目录ID
     * @param name          文件夹名
     * @param checkNameEnum 同名策略
     * @return 创建文件夹响应参数
     */
    CreateFolderResponse createFolder(String parentFileId, String name, CheckNameEnum checkNameEnum);

    /**
     * 创建文件夹，使用默认的同名策略，自动重命名
     *
     * @param parentFileId 父目录ID
     * @param name         文件夹名
     * @return 创建文件夹响应参数
     */
    CreateFolderResponse createFolder(String parentFileId, String name);


    /**
     * 创建文件夹，使用默认的顶级目录、同名策略，自动重命名
     *
     * @param name 文件夹名
     * @return 创建文件夹响应参数
     */
    CreateFolderResponse createFolder(String name);


    /**
     * 上传文件（支持快传和零拷贝）
     *
     * @param parentFileId  父目录ID
     * @param path          文件路径
     * @param checkNameEnum 同名策略
     * @return 响应后的操作
     */
    CreateFileResponse uploadFile(String parentFileId, Path path, CheckNameEnum checkNameEnum);

    /**
     * 上传文件，使用默认的同名策略，自动重命名（支持快传和零拷贝）
     *
     * @param parentFileId 父目录ID
     * @param path         文件路径
     * @return 响应后的操作
     */
    CreateFileResponse uploadFile(String parentFileId, Path path);


    /**
     * 上传文件，使用默认的顶级目录、同名策略，自动重命名（支持快传和零拷贝）
     *
     * @param path 文件路径
     * @return 响应后的操作
     */
    CreateFileResponse uploadFile(Path path);


    /**
     * 修改文件名
     * @param updateRequest 修改文件名的请求参数
     * @return 修改后的文件信息
     */
    BaseItem update(UpdateRequest updateRequest);

    /**
     * 修改文件名
     * @param fileId 文件ID
     * @param name 修改成的文件名
     * @return 修改后的文件信息
     */
    BaseItem update(String fileId, String name);

}
